import Vue from 'vue'
import router from './router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import {setDocumentTitle, domTitle} from '@/utils/domUtil'
import {ACCESS_TOKEN, LOGIN_PAGE} from '@/config/constants'
import {isJwtTokenExpire} from '@/utils/jwt'
import store from '@/store'
import {staticRouteConfigs} from '@/config/router.config.js'

/**
 * 判断一个路由是否属于公共页面
 * @param toRoute 路由
 * @param routeConfigs 公共页面的配置
 */
function isPublicPage(toRoute, routeConfigs = staticRouteConfigs) {
  return routeConfigs.some(rc => {
    const flag = rc.name === toRoute.name || rc.path === toRoute.path
    if (flag) {
      return true
    } else if (rc.children && rc.children.length) {
      const children = rc.children
      return isPublicPage(toRoute, children)
    } else {
      return false
    }
  })
}

NProgress.configure({showSpinner: false})

router.beforeEach((to, from, next) => {
  console.debug('页面路由跳转 --> ' + to.path)
  NProgress.start()
  to.meta && (typeof to.meta.title !== 'undefined' && setDocumentTitle(`${to.meta.title} - ${domTitle}`))

  const root = store.getters.root
  const token = Vue.ls.get(ACCESS_TOKEN)
  const tokenInvalid = !token || isJwtTokenExpire(token)
  const accessibleViews = store.getters.role.accessibleViews
  const routePermission = to.meta ? to.meta.permission : null

  let routePermissionLikePattern = null
  if(routePermission && routePermission.includes('.')){
    let rarr = routePermission.split('.')
    routePermissionLikePattern = `${rarr[0]}.*`
  }
  console.debug('routePermission: %o, accessibleViews: %o, routePermissionLikePattern: %o',
    routePermission,accessibleViews,routePermissionLikePattern)

  // 用户是否登录是用token有效与否来做判断依据
  // 而用户有没有访问目标页面路由，则需要结合用户拥有的权限+路由声明需要的权限，做校验

  // token无效
  if (tokenInvalid) {
    if (to.path === LOGIN_PAGE) {
      next()
    } else if (isPublicPage(to)) {
      next()
    } else {
      next({path: LOGIN_PAGE, query: {redirect: to.fullPath}})
    }
  }

  // token有效
  if (!tokenInvalid) {
    console.debug('token有效')
    if (to.path === LOGIN_PAGE) {
      console.debug("是去登录页的，因为已经登录了，中断导航")
      next(false)
    } else if (root) {
      console.debug("超级管理员，放行")
      next()
    } else if (!routePermission || routePermission === '') {
      console.debug("路由没有声明需要访问权限，放行")
      next()
    } else if (routePermission === '*') {
      console.debug("路由没有声明需要访问权限是模糊匹配的，即它不是一个叶子节点，放行")
      next()
    } else if (accessibleViews.some(code => routePermission === code)) {
      console.debug("用户拥有的权限 与 路由上声明需要的权限，有交集则证明有权限，放行")
      next()
    } else if (routePermissionLikePattern && accessibleViews.some(code => routePermissionLikePattern === code)) {
      console.debug("用户拥有的权限 与 路由上声明需要的权限，模糊匹配成功，放行")
      next()
    } else {
      next({path: '/403'})
    }
  }
  NProgress.done()
})

router.afterEach(() => {
  NProgress.done()
})
